package com.zjl.quartz.第01章_基础的使用;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.AnnualCalendar;
import org.quartz.impl.calendar.DailyCalendar;
import org.quartz.impl.calendar.MonthlyCalendar;

import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 * AnnualCalendar（年度日历）： 允许你指定每年的特定日期，标记为不执行的日期，比如节假日等。
 * CronCalendar（Cron日历）： 根据 Cron 表达式指定一组不执行的日期。
 * DailyCalendar（每日日历）： 允许你指定每天的特定时间段，任务只能在该时间段内触发。
 * HolidayCalendar（节假日日历）： 类似 AnnualCalendar，允许你指定一年中不执行任务的特定日期。
 * MonthlyCalendar（每月日历）： 允许你指定每月的特定日期，标记为不执行的日期
 */
public class E_调度器 {
    public static void main(String[] args) throws SchedulerException {
        // 1.定义例外
        AnnualCalendar holidays = new AnnualCalendar();
        //只生效  月和日
        Calendar xx = new GregorianCalendar(9999, Calendar.AUGUST, 30);
//        holidays.setDayExcluded(xx, true);//排除的日期，如果设置为false则为包含
        holidays.setDayExcluded(xx, true);//排除的日期，如果设置为false则为包含

        //排除每天  14:54-14:55的执行
        DailyCalendar dailyCalendar = new DailyCalendar("14:54", "14:55");
        //排除月份
        MonthlyCalendar monthlyCalendar = new MonthlyCalendar();
        monthlyCalendar.setDayExcluded(29, true);//排除 29号的执行

        // 定义jobDetail
        JobDetail job = JobBuilder.newJob(E_Job.class)
                .withIdentity("job1", "jGroup1")
                .usingJobData("count", 0)           // 通过key-value形式设置参数
                .build();


        // 创建一个 Cron 触发器
        CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                .withIdentity("cronTrigger1", "cGroup1")

                .withSchedule(CronScheduleBuilder.cronSchedule("*/2 * * * * ?"))
                // 与自定义的 Calendar 关联
                .modifiedByCalendar("holidays")
                .modifiedByCalendar("dailyCalendar")
                .modifiedByCalendar("monthlyCalendar")
                .build();

        // 3.定义调度器
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        // 2.将自定义的 Calendar 添加到 Scheduler 中   是否替换与存在的AnnualCalendar    是否更新与 Calendar 相关联的任何触发器
        scheduler.addCalendar("holidays", holidays, false, false);
        scheduler.addCalendar("dailyCalendar", dailyCalendar, false, false);
        scheduler.addCalendar("monthlyCalendar", monthlyCalendar, false, false);
        // 设置任务和触发器，由触发器进行分派任务
        scheduler.scheduleJob(job, cronTrigger);
        scheduler.start();
    }
}
